home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
listings
/
v_12_01
/
smith
/
sfloat.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1993-11-08
|
3KB
|
126 lines
// SFLOAT.CPP, Listing 3
#include <sfloat.hpp>
// Work space
unsigned short sfloat::Exp;
unsigned short sfloat::Man;
// Bit masks to extract parts of ieee float
unsigned long sfloat::fManSignMask = 0x80000000L;
unsigned long sfloat::fExpMask = 0x7F800000L;
unsigned long sfloat::fManMask = 0x007FFFFFL;
// Bit mask to extract parts of short float
unsigned short sfloat::sfManSignMask = 0x8000;
// float exponent bias
unsigned short sfloat::fBias = 127;
// short float exponent bias
unsigned short sfloat::sfBias = 127;
// fBias - sfBias
unsigned short sfloat::fsfBias = 0;
// if signed flag
unsigned short sfloat::Signed = 1;
// number of float exponent bits
unsigned short sfloat::fExpBits = 8;
// number of short float exponent bits
unsigned short sfloat::sfExpBits = 8;
// number of float mantissa bits
unsigned short sfloat::fManBits = 23;
// number of short float mantiss bits
unsigned short sfloat::sfManBits = 7;
// number of float mantissa sign bits
unsigned short sfloat::fManSignBits = 1;
// number of float mantissa sign bits
unsigned short sfloat::sfManSignBits = 1;
// number of short float bits
unsigned short sfloat::sfBits = 16;
// float mantissa shift
unsigned short sfloat::fManShift1 = 9;
// float mantissa shift
unsigned short sfloat::fManShift2 = 7;
// short float mantissa shift
unsigned short sfloat::sfManShift = 16;
// float exponent shift
unsigned short sfloat::fExpShift = 8;
// short float exponent shift
unsigned short sfloat::sfExpShift = 8;
// short float exponent minimum bits
unsigned short sfloat::sfExpBitsMin = 1;
// short float exponent maximum bits
unsigned short sfloat::sfExpBitsMax = 8;
// union for conversion
union conv sfloat::u;
void sfloatrange( unsigned short sfNumExpBits,
unsigned short sfSigned )
{
// Set the number of short float exponent bits
sfloat::sfExpBits = sfNumExpBits;
if ( sfloat::sfExpBits > sfloat::sfExpBitsMax )
{
sfloat::sfExpBits = sfloat::sfExpBitsMax;
}
else if ( sfloat::sfExpBits <
sfloat::sfExpBitsMin )
{
sfloat::sfExpBits = sfloat::sfExpBitsMin;
}
// Set the number of short float sign bits
if ( sfSigned )
{
sfloat::Signed = sfloat::sfManSignBits = 1;
}
else
{
sfloat::Signed = sfloat::sfManSignBits = 0;
}
// Set the number of short float mantissa bits
sfloat::sfManBits = sfloat::sfBits -
sfloat::sfManSignBits - sfloat::sfExpBits;
// Set the short float exponent bias value
sfloat::sfBias = 0;
sfloat::sfBias =
( 1 << ( sfloat::sfExpBits - 1 )) - 1;
sfloat::fsfBias = sfloat::fBias - sfloat::sfBias;
// Set the converson shift values
sfloat::fManShift1 = sfloat::sfManSignBits +
sfloat::sfExpBits;
sfloat::fManShift2 = sfloat::sfBits -
sfloat::fExpBits - sfloat::fManSignBits;
sfloat::sfManShift = sfloat::fManBits -
sfloat::sfBits + sfloat::sfExpBits +
sfloat::sfManSignBits;
sfloat::fExpShift = sfloat::sfManBits +
sfloat::sfManSignBits;
sfloat::sfExpShift = sfloat::sfBits -
sfloat::sfExpBits;
} // sfloatrange
// End SFLOAT.CPP